/*
 Trabajo Practico 3 Ejercicio 4
 Cliente UDP
 Primera Entrega

 - Integrantes:
        - Cortez, Martin                DNI: 30440023
        - Barrera, Lourdes              DNI: 33306634
        - Martinez, Guillermo   		DNI: 34510461
        - Reyes, Leandro                DNI: 34213699
        - Rodriguez, Lucas              DNI: 34265017
*/

#include "../defines.c"

// Handler que finaliza cliente
void finalizar(int);

// Socket
int sk_server;

int main()
{
	int numbytes, i;
	char buf[TAM_MSJ], mensaje[TAM_MSJ];
	struct hostent *he;
	struct sockaddr_in server;
	int sizeofserver=sizeof(server);

	printf("Iniciando cliente...\n");

	if((he=gethostbyname(HOST)) == NULL)
	{
		printf("Error de host: %s\n",strerror(errno));
		exit(1);
	}

	// Abre socket
	if ((sk_server=socket(AF_INET, SOCK_DGRAM, 0))==-1)
	{
		printf("Error en socket: %s\n",strerror(errno));
		exit(1);
	}

	// Define las propiedades del socket
	server.sin_family = AF_INET;
	server.sin_port = htons(PUERTO);
	server.sin_addr = *((struct in_addr *)he->h_addr);
	bzero(&(server.sin_zero),8);

	// Manejar la finalizacion
	signal(SIGUSR1,finalizar);
	signal(SIGINT,finalizar);
	signal(SIGTERM,finalizar);

	// Calcula el tiempo
	timestamp(mensaje);

	// Enviar mensaje al servidor
	sendto(sk_server,&mensaje,sizeof(mensaje),0,(struct sockaddr*)&server,sizeofserver);
	printf("Enviado: %s\n",mensaje);

	// Esperar la respuesta del servidor
	if ((numbytes=recvfrom(sk_server,buf,TAM_MSJ,0,(struct sockaddr*)&server,&sizeofserver)) == -1)
	{
		printf("Error en receive: %s\n",strerror(errno));
		exit(1);
	}
	buf[numbytes]='\0';

	// Muestra lo que recibio del servidor
	printf("Tiempo del server: %s\n",buf);
}

void finalizar(int signal)
{
	close(sk_server);
	printf("Cliente finalizado por el usuario\n");
	exit(0);
}
